
//1. 实现顺序/循环或链式队列的进队、出队、判断队空、显示队列中全部元素的运算。
//2. 设计一个选择式菜单，以菜单方式选择队列的各种操作。

#include "stdio.h"
#include <stdlib.h>
typedef int ElementType;

// 结点存储
typedef struct QueueNode
{
	ElementType data;
	struct Node *next;
} Node;

//队列定义
typedef struct Queue
{
	//	头指针
	Node *front;
	//	尾指针
	Node *rear;
	//
	int lengh;
} LinkQueue;

//初始化队列
LinkQueue *InitLinkQueue()
{

	LinkQueue *top = (LinkQueue *)malloc(sizeof(LinkQueue));
	top->front = NULL;
	top->rear = NULL;
	top->lengh = 0;
	return top;
}

// 入队
int PushElementQueue(LinkQueue *top, ElementType element)
{
	// 需要一个数据结点
	Node *node = (Node *)malloc(sizeof(Node));
	node->data = element;
	node->next = NULL;
	if (top->front == NULL)
	{
		// 第一个结点
		top->front = top->rear = node;
	}
	else
	{
		top->rear->next = node;
		top->rear = node;
	}
	top->lengh++;
	return 1;
}

// 打印队列
void PirntQueue(LinkQueue *top)
{
	LinkQueue *temp = top;
	Node *node = top->front;
	//  如果不用队列长的话 当到最后一个的时候要多打印一次最后一个的数据
	while (node->next != NULL)
	{
		printf("%d->", node->data);
		node = node->next;
	}
	printf("%d\n", node->data);
	//  用队列长的话就不用这么麻烦多打印一次
	// int i = 0;
	// for (i = 0; i < top->lengh; i++)
	// {
	// 	printf("%d->", node->data);
	// 	node = node->next;
	// }
}

// 出队操作
int PopElementQueue(LinkQueue *top)
{
	// 将头部指向的取出
	Node *node = top->front;
	// 改变指向
	top->front = top->front->next;
	top->lengh--;
	return node->data;
}

// 判断队列空
int EmptyQueue(LinkQueue *top)
{
	return top->lengh == 0;
}

int main(int argc, char *argv[])
{
	LinkQueue *top = InitLinkQueue();
	int i, j, k;
	int emtity;
	int x;
	do
	{
		printf("\n\n\n\n");
		printf("\t\t\t 队列子系统\n");
		printf("\t\t*******************************\n");
		printf("\t\t*        1----进 队 列　  　　*\n");
		printf("\t\t*        2----出 队 列　　　　*\n");
		printf("\t\t*        3----队列空否　　　　*\n");
		printf("\t\t*        4----显示队列　　　　*\n");
		printf("\t\t*        0----返　　回　　　　*\n");
		printf("\t\t*******************************\n");
		printf("\t\t 请选择菜单项(0－4)：");
		scanf("%d", &k);
		getchar();
		switch (k)
		{
		case 1: //进队列
			printf("\n   请输入要进队列的数据X:");
			scanf("%d", &x);
			getchar();
			PushElementQueue(top, x);
			break;
		case 2: //出队列
			printf("---出队列--- \n");
			printf("队头元素是:%d \n", PopElementQueue(top));
			break;
		case 3:
			//  队列是否为空
			emtity = EmptyQueue(top);
			if (emtity == 1)
			{
				printf("队列为空\n");
			}else{
				printf("队列不为空\n");
			}
			break;
		case 4:
			// 打印队列
			PirntQueue(top);
			break;
		}
	} while (k != 0);
	return 0;
}